From 330759ba03067ca12f7036bffd44a7e8163d2136 Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Wed, 30 Jan 2008 11:13:29 -0700 Subject: [PATCH] [IA64] Fix infinite loop in fault handler if debugger is not connected If xen is compiled with crash_debug=y and the debugger is not connected, the fault handler enters infinite loop. regs may be on stack, so split the incrementing out of vcpu_increment_iip(). Signed-off-by: Kazuhiro Suzuki --- xen/arch/ia64/vmx/vmx_fault.c | 1 + xen/arch/ia64/xen/faults.c | 1 + xen/arch/ia64/xen/vcpu.c | 7 +------ xen/include/asm-ia64/linux-xen/asm/ptrace.h | 9 +++++++++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/xen/arch/ia64/vmx/vmx_fault.c b/xen/arch/ia64/vmx/vmx_fault.c index c015bf4ea0..c7bacf3376 100644 --- a/xen/arch/ia64/vmx/vmx_fault.c +++ b/xen/arch/ia64/vmx/vmx_fault.c @@ -181,6 +181,7 @@ vmx_ia64_handle_break (unsigned long ifa, struct pt_regs *regs, unsigned long is if (iim == 0) show_registers(regs); debugger_trap_fatal(0 /* don't care */, regs); + regs_increment_iip(regs); } else #endif { diff --git a/xen/arch/ia64/xen/faults.c b/xen/arch/ia64/xen/faults.c index bf75b630cf..946eb28e4b 100644 --- a/xen/arch/ia64/xen/faults.c +++ b/xen/arch/ia64/xen/faults.c @@ -515,6 +515,7 @@ ia64_handle_break(unsigned long ifa, struct pt_regs *regs, unsigned long isr, if (iim == 0) show_registers(regs); debugger_trap_fatal(0 /* don't care */ , regs); + regs_increment_iip(regs); } #endif else if (iim == d->arch.breakimm && diff --git a/xen/arch/ia64/xen/vcpu.c b/xen/arch/ia64/xen/vcpu.c index 36c9bb2d81..7ba29f3036 100644 --- a/xen/arch/ia64/xen/vcpu.c +++ b/xen/arch/ia64/xen/vcpu.c @@ -804,12 +804,7 @@ IA64FAULT vcpu_set_iip(VCPU * vcpu, u64 val) IA64FAULT vcpu_increment_iip(VCPU * vcpu) { REGS *regs = vcpu_regs(vcpu); - struct ia64_psr *ipsr = (struct ia64_psr *)®s->cr_ipsr; - if (ipsr->ri == 2) { - ipsr->ri = 0; - regs->cr_iip += 16; - } else - ipsr->ri++; + regs_increment_iip(regs); return IA64_NO_FAULT; } diff --git a/xen/include/asm-ia64/linux-xen/asm/ptrace.h b/xen/include/asm-ia64/linux-xen/asm/ptrace.h index d44b1da3d5..97ab9cf15a 100644 --- a/xen/include/asm-ia64/linux-xen/asm/ptrace.h +++ b/xen/include/asm-ia64/linux-xen/asm/ptrace.h @@ -281,6 +281,15 @@ struct switch_stack { # define guest_mode(regs) (ia64_psr(regs)->cpl != 0) # define guest_kernel_mode(regs) (ia64_psr(regs)->cpl == CONFIG_CPL0_EMUL) # define vmx_guest_kernel_mode(regs) (ia64_psr(regs)->cpl == 0) +# define regs_increment_iip(regs) \ +do { \ + struct ia64_psr *ipsr = ia64_psr(regs); \ + if (ipsr->ri == 2) { \ + ipsr->ri = 0; \ + regs->cr_iip += 16; \ + } else \ + ipsr->ri++; \ +} while (0) #else # define user_mode(regs) (((struct ia64_psr *) &(regs)->cr_ipsr)->cpl != 0) #endif -- 2.30.2